﻿using PhraseCorrector.Common;
using PhraseCorrector.DirectTanslate;
using PhraseCorrector.SpellCore;
using System;
using System.Collections.Generic;
using System.Diagnostics;


/*
* **************************************************************************************
* 
*  对识别出的文字集按照Rect坐标进行分离、拼接
*  
*              
*                                               2024-3-18
* ***************************************************************************************
*/

namespace PhraseCorrector.WordLineSplit
{
    public class ListCorrector
    {

        #region 成员变量

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 中文识别结果，专门用于存储和处理中文的识别数据
        /// </summary>
        private PhraseResult ChineseResult { set; get; } = new PhraseResult();

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 英文识别结果，专门用于存储和处理英文的识别数据
        /// </summary>
        private PhraseResult EnglishResult { set; get; } = new PhraseResult();

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 拼音识别结果，用于存储拼音的识别数据，可能用于中文相关的识别处理
        /// </summary>
        private PhraseResult PinyinResult { set; get; } = new PhraseResult();
        #endregion

        #region 静态调用入口

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 静态调用入口
        /// </summary>
        /// <param name="result">OCR识别结果</param>
        /// <returns>融合后的对象消息列表</returns>
        public static PhraseResult SplitJoint(PhraseResult result)
        {
            // 创建并使用WordFusion类进行融合处理
            return new ListCorrector().CorrectWordFrequency(result);
        }

        #endregion

        #region 文字纠错

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 对识别结果中的文字进行频率纠错。
        /// </summary>
        /// <returns>返回纠错后的OCR消息列表。</returns>
        private PhraseResult CorrectWordFrequency(PhraseResult result)
        {
            SplitEmptyObj(result);
            // 返回纠错后的文字列表
            return result;
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 处理空对象，决定是否需要对文字进行频率纠错。
        /// </summary>
        /// <param name="obj">待处理的OCR消息对象。</param>
        private void SplitEmptyObj(PhraseResult obj)
        {
            GetResult(obj);
            SplitCorrectWord(obj);
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取考试结果的摘要信息。
        /// </summary>
        /// <param name="source">包含考试结果详细信息的对象。</param>
        private void GetResult(PhraseResult source)
        {
            // 获取语文考试结果
            GetChineseResult(source);
            // 获取英语考试结果
            GetEnglishResult(source);
            // 获取拼音考试结果
            GetPinyinResult(source);
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取中文拼写检查结果。
        /// </summary>
        /// <param name="source">包含源中文文本的结果对象。</param>
        private void GetChineseResult(PhraseResult source)
        {
            if (!string.IsNullOrEmpty( source.Chinese))
                ChineseResult = ChineseTraslator.SpellPhraseCorrect(source.Chinese);
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取字母拼写检查结果。
        /// </summary>
        /// <param name="source">包含源字母文本的结果对象。</param>
        private void GetEnglishResult(PhraseResult source)
        {
            if (!string.IsNullOrEmpty(source.Words))
                EnglishResult = EnglishTraslator.SpellPhraseCorrect(source.Words);
        }

        ////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 获取拼音拼写检查结果。
        /// </summary>
        /// <param name="source">包含源中文文本和字母文本的结果对象。</param>
        private void GetPinyinResult(PhraseResult source)
        {
            if (!string.IsNullOrEmpty(source.Words))
                PinyinResult = PinyinTranslator.SpellPhraseCorrect(source.Words);
        }

        // ///////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 对识别的文字进行具体的频率纠错操作。
        /// </summary>
        /// <param name="obj">待纠错的OCR消息对象。</param>
        /// <param name="ret">纠错结果对象，包含中文和英文的纠错结果。</param>
        private void SplitCorrectWord(PhraseResult obj)
        {
            EnglishOrPinyin(obj);
        }

        // ///////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 判断是否为英文或者拼音，并进行分别处理。
        /// </summary>
        /// <param name="obj">待纠错的OCR消息对象。</param>
        /// <param name="ret">纠错结果对象，包含中文和英文的纠错结果。</param>
        private void EnglishOrPinyin(PhraseResult obj)
        {
            new ChineseSimilary( ChineseResult, EnglishResult, PinyinResult ).SetBetter(obj);
            new EnglishSimilary(ChineseResult, EnglishResult, PinyinResult).SetBetter(obj);
            new PinyinSimilary(ChineseResult, EnglishResult, PinyinResult).SetBetter(obj);
        }

        #endregion
    }
}
